/**
 * 爬虫：书籍信息
 * 1.安装AXios模块：npm install axios,通过http访问豆瓣，并获取所需的内容
 * 2.处理获取的结果：处理响应的json数据
 * 
 * 3.从豆瓣获取书籍信息需要的网络访问和页面分析组件:npm install cheerio
 * 通过类似的JQery的风格访问DDM元素
 * iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件。
 * 它的作用是在多种国际编码格式之间进行文本内码的转换。
 * http://localhost:3001/books/fetch/9787521738575本地访问地址 
 * locahost:3001/books/fetch/isbn就是当前自己选择书籍的isbn编号
 */
const express = require('express')
const { getReturnJSONData } = require('../util/common.js')
// 引入自定义模块
const config = require('../config.js')
// 引入axios模块，用于支持http、HTTPS访问
const axios = require('axios').default
// 引入cheerio模块，用于解析HTML
const cheerio = require('cheerio')
const book = require('../mock/book.js')

axios.defaults.baseURL = config.douban.baseUrl

module.exports = {
  fetch,
}
// 采集的信息对象定义
let bookInfo = {
  title: '',
  oldname: '',
  pic: '',
  author: '',
  publisher: '',
  translator: '',
  pubdate: '',
  pages: '',
  price: '',
  binding: '',
  series: '',
  isbn: '',
}
/**
 *
 * @param {express.Request} req
 * @param {express.Response} res
 * @param {express.NextFunction} next
 */
function fetch(req, res, next) {
  // params 获取url restful参数
  let isbn = req.params.isbn
  // 1.从信息源（豆瓣）通过http访问获取相关页面信息
  // axios
  //   .get(isbn)
  //   .then((result) => {
  //     // console.log(result)
  //     bookInfo = fetchDouban(result.data.data)
  //     res.json(getReturnJSONData(200, '从豆瓣获取相关书籍信息', bookInfo))
  //   })
  //   .catch((e) => {
  //     // console.log(e)
  //     res.json(getReturnJSONData(400, '从豆瓣获取相关书籍信息失败', {}))
  //   })
  bookInfo = fetchDouban(book.data)
  res.json(getReturnJSONData(200, '从豆瓣获取相关书籍信息', bookInfo))
}
/**
 * 对豆瓣页面信息进行清洗与格式化
 * @param {String} html
 * @returns bookInfo 对象
 */
// 2.对获取的信息进行数据清洗，格式化
function fetchDouban(html) {
  // 重置bookinfo
  clearBookInfo()
  // 加载cheerio页面分析
  const $ = cheerio.load(html) //$定义变量， 将加载的页面赋值给变量$
  // TODO:分析豆瓣的选择器应该独立，存入数据库，并交由后台管理中控制，数据源可以采用多元化配置，例如：京东、国家图书馆、超星图书馆
  let title = $('#wrapper h1 span').text()
  // console.log('title：', title)
  let pic = $('#content #mainpic img').attr('src')
  // console.log('pic：', pic)
  // let info = $('#wrapper #content #info').html()
  let info = $('#wrapper #content #info').text().trim().split('\n')//$指代对象，加载数据
  // console.log(info);

  formatInfo(bookInfo, info)//格式化输出

  bookInfo.title = title
  bookInfo.pic = pic

  return bookInfo
}
/**
 * 豆瓣网页信息中作者与译者信息与其他信息的标签不同，从问问方式处理
 * @param {bookInfo} bookInfo
 * @param {String[]} info
 */
function formatInfo(bookInfo, info) {
  let infoArr = []
  // 去掉空格
  info.forEach(element => {
    element = element.trim()
    if (!element.match(/^[ ]*$/)) {
      infoArr.push(element)
    }
  })
  // 标准化分割 |  用别名，格式化输出
  // FIXME: 依据豆瓣书籍页面信息，需要修改数据标准化方法
  let infoStr = infoArr.join('')

  console.log(infoStr)

  let temp = infoStr
    .replace('作者:', '作者:')
    .replace('出版社:', '|出版社:')
    .replace('副标题:', '|副标题:')
    .replace('出品方:', '|出品方:')
    .replace('原作名:', '|原作名:')
    .replace('译者:', '|译者:')
    .replace('出版年:', '|出版年:')
    .replace('页数:', '|页数:')
    .replace('定价:', '|定价:')
    .replace('装帧:', '|装帧:')
    .replace('丛书:', '|丛书:')
    .replace('ISBN:', '|ISBN:')
  console.log(temp)

  // let temp = '';
  // let start = 0;
  // for (let i = start; i < infoArr.length; i++) {
  //     if (infoArr[i].match('作者')) {
  //         temp += infoArr[i];
  //     } else if (infoArr[i].match('出版社')) {
  //         infoC.push(temp);
  //         start = i;
  //         temp = '';
  //         break;
  //     }else{
  //         temp += infoArr[i];
  //     }
  // }
  // for (let i = start; i < infoArr.length; i++) {
  //     if (!infoArr[i].match('译者')) {
  //         infoC.push(infoArr[i]);
  //     } else {
  //         start = i;
  //         break;
  //     }
  // }
  // for (let i = start; i < infoArr.length; i++) {
  //     if (infoArr[i].match('译者')) {
  //         temp += infoArr[i];
  //     } else if (infoArr[i].match('出版年')) {
  //         infoC.push(temp);
  //         start = i;
  //         temp = '';
  //         break;
  //     }else{
  //         temp += infoArr[i];
  //     }
  // }
  // for (let i = start; i < infoArr.length; i++) {
  //     infoC.push(infoArr[i]);
  // }

  // console.log(infoC);

  let infoC = temp.split('|')
  // 数据提取
  for (let i = 0; i < infoC.length; i++) {
    const element = infoC[i]
    if (element.match('作者')) {
      bookInfo.author = element.split(':')[1].trim()
    }
    if (element.match('出版社')) {
      bookInfo.publisher = element.split(':')[1].trim()
    }
    if (element.match('译者')) {
      bookInfo.translator = element.split(':')[1].trim()
    }
    if (element.match('出版年')) {
      bookInfo.pubdate = element.split(':')[1].trim()
    }
    if (element.match('页数')) {
      bookInfo.pages = element.split(':')[1].trim()
    }
    if (element.match('定价')) {
      bookInfo.price = element.split(':')[1].trim()
    }
    if (element.match('装帧')) {
      bookInfo.binding = element.split(':')[1].trim()
    }
    if (element.match('丛书')) {
      bookInfo.series = element.split(':')[1].trim()
    }
    if (element.match('ISBN')) {
      bookInfo.isbn = element.split(':')[1].trim()
    }
    if (element.match('原作名')) {
      bookInfo.oldname = element.split(':')[1].trim()
    }
  }
}
/**
 * 清除bookInfo原有内容
 */
function clearBookInfo() {
  for (const key in bookInfo) {
    if (Object.hasOwnProperty.call(bookInfo, key)) {
      bookInfo[key] = ''
    }
  }
}
